# 4-1 写出下述程序的执行结果
s1 = [1,3,'5','7',True]
s1.append('False')
del s1[-2]
print("s1=",s1)
s2 = []
s2.extend(['a','b'])
s2.append(['c','d'])
print("s2=",s2)
# 执行结果
# s1= [1, 3, '5', '7', 'False']
# s2= ['a', 'b', ['c', 'd']]

# 4-2 输入下述代码后运行，并对执行结果做出解释
lst = [23,56,8,900,24]
lst.remove(8)
lst.append(30)
lst.insert(1,22)
lst.extend([66,90])
lst.pop(2)
lst.pop()
lst.sort()
lst.reverse()
print(lst)
# 执行结果解释：首先定义一个列表并用变量接受，接着用remove语句删除列表中的8元素，再用append语句将元素30加在列表尾部
# 然后用insert语句将元素22插入在下标索引为1的位置，接着用extend语句将列表中的元素66，90依次取出加入到列表的尾部
# 然后用pop语句将lst列表中下标索引为2的元素取出并返回出去，接着再用依次pop语句但括号内没有下标索引，所以默认取出列表的最后一个元素
# 并返回，然后用sort语句将列表进行排序（从小到大），再用reserve语句将列表倒序（从大到小），最后将列表打印出来

# 4-3 写出下述代码的执行结果
lst = [23,56,8,900,24]
print(lst.index(8))
print(lst.count(8))
print(len(lst))
print(max(lst))
print(min(lst))
print(sum(lst))
# 运行结果：
# 2
# 1
# 5
# 900
# 8
# 1011

# 4-4 写出下述程序的运行结果
lst = [23,56,8,900,24]
print(lst[-2])
print(lst[1:4])
print(lst[::2])
print(lst[::-1])
# 运行结果
# [56, 8, 900]
# [23, 8, 24]
# [24, 900, 8, 56, 23]

# 4-5 用for循环语句以及切片方法设计一个程序，找出100000以内的所有回文数
def palindromes(num):
    # 将数字转换成字符串
    str_num = str(num)
    # 检查字符串和反转后的字符串是否一样
    return str_num == str_num[::-1]
# 定义一个列表
palindromes_num = []
for num in range(100000):
    if palindromes(num):
        palindromes_num.append(num)
print(palindromes_num)

# 4-6 使用快速列表生成方法生成长度为10的列表。然后借助for循环，将列表元素循环左移一个位置
# 生成一个长度为十的列表
o_list = [x for x in range(10)]
print(o_list)
print("o_list列表的长度是:",len(o_list))
# 复制原始列表
list_1 = o_list[:]
# 借助for循环列表元素循环左移一个位置
first_element = list_1[0] # 暂存第一个元素
for i in range(len(list_1)):
    if i == len(list_1)-1:
        list_1[i] = first_element
    else:
        list_1[i] = list_1[i+1]
print(list_1)

# 4-7 编写程序找出整数列表中最大元素的下标，如果最大元素的个数超过1，那么请打印输出所有的下标
def find_max(list):
    if len(list) == 0:
        return []
    else:
        max_num = list[0]
        max_index = [0]
        for i in range(len(list)):
            if list[i] > max_num:
                max_num = list[i]
                max_index = [i]
            elif list[i] == max_num:
                max_index.append(i)
        return max_index
# 演示案例
list = [1,2,3,55,6,7,55,8]
index = find_max(list)
print(f"列表中最大元素的下标是{index}")

# 4-8 编写程序删除列表中的重复值
def delete(list):
    new_list = []
    encountered = []
    for i in list:
        if i not in encountered:
            new_list.append(i)
            encountered.append(i)
    return new_list
# 示例演示
list_1 = [1,2,2,3,4,4,4,5,6,7,7]
new_list = delete(list_1)
print(f"列表删除重复元素后结果是：{new_list}")

# 4-9 生成一个8行6列的矩阵，其元素值等于该元素所在位置的行号+列号，其中行列号均从1开始记
# matrix.py
matrix_A = [[r+c for c in range(1,7)] for r in range(1,9)]
print(f"4-9：{matrix_A}")

# 4-10 生成一个6行12列的矩阵，其元素值是小于或等于20的随机数
# 导入随机模块
import random
# matrix.py
matrix_B = [[0]*12 for _ in range(6)]
# 定义循环
for i in range(6):# 定义行循环
    for j in range(12):# 定义列循环
        random_num = random.randint(0,20)  # 生成0到20之间的随机整数
        matrix_B[i][j] = random_num
print(f"4-10:{matrix_B}")

# 4-11 设计1个程序，计算4-9中生成的矩阵A与4-10中生成的矩阵B的乘积，并打印出结果矩阵C
# 定义结果矩阵C——8行12列
matrix_C = [[0]*12 for _ in range(8)]
# 定义循环
for i in range(8): # 循环遍历矩阵A的行
    for j in range(12): # 循环遍历矩阵B的列
        for k in range(6): #循环遍历A的列和B的行
            matrix_C[i][j] += matrix_A[i][k] * matrix_B[k][j]
print(f"4-11:{matrix_C}")

# 4-12 修改微实践中的程序，将54张牌中的51张随机分发给3位玩家，其中每人17张牌
# poker.py
import random # 导入随机数

from matplotlib.pyplot import ylabel

suits = ["Spades","Hearts","Diamonds","Clubs"] # 四种花色
ranks = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"] # 十三种牌面
# 将花色与牌面组合并加上大小王，生成54张牌的列表
cards = [x+"_"+y for x in suits for y in ranks] + ["Red Joker","Black Joker"]
# 生成三个玩家的持牌列表，和一个存放地主牌的列表
player_1 = []
player_2 = []
player_3 = []
three_cards = []
for i in range(51):        # 循环51次共取51张牌
    idx = random.randint(0,len(cards)-1)  # 生成一个0~剩余牌数-1的随机数
    c = cards.pop(idx)      # 将指定下标的牌取出
    # 随机分给3个玩家
    if len(player_1) < 17:
        player_1.append(c)
    elif len(player_2) < 17:
        player_2.append(c)
    else:
        player_3.append(c)
# 剩下的三张牌当作地主牌
three_cards = cards
# 将三位玩家的持牌列表和地主牌打印出来
print(f"player_1's cards:{player_1}")
print(f"player_2's cards:{player_2}")
print(f"player_3's cards:{player_3}")
print(f"three_cards cards:{three_cards}")

# 4-13 下述代码第2行和第3行的区别是什么？请打印dummy的值来证实/证伪你的判断并说明理由。
dummy = ['bob']
dummy.extend(['henry','mary'])
dummy.append(['henry','mary'])
# 区别：列表.extend(数据容器)是将数据容器（在这里是列表）中的元素一一取出加在列表的尾部
#      列表.append(元素)是将元素直接加在列表的尾部
# 由此可知第二行代码执行是将数据容器中的'henry'和'mary'一一取出加在dummy列表中
# 而第3行代码执行是将['henry','mary']直接加在dummy列表中
# 打印dummy的值
print(dummy)
# 运行结果：
# ['bob', 'henry', 'mary', ['henry', 'mary']]

# 4-14 写出下列程序的执行结果
# print(list(range(2,10,3)))
# print(list(range(5)))
# print(list(range(10,-10,-5)))
# 运行结果
#[2,5,8]
#[0,1,2,3,4]
#[10,5,0,-5]
